// 云函数入口文件

const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
const _ = db.command

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  //获取活动信息
  let active = await db.collection('activity').doc(event.actid).get()
  let reward = await db.collection('reward').where({
    status: 0
  }).get()
  console.log(active);
  let cards = active.data.keywords.split('')

  let now = new Date()
  let data = {} //构建return数据
  //先判断活动到期或者无库存
  if (active.data.endTime < now.getTime()) {
    data.code = -1
    data.msg = '活动已结束'
  } else if (active.data.win >= active.data.total && reward.data.length === 0) { //库存有两个判断条件，一个是活动获奖人数大于等于奖品总数时,还有兑换码没有了时
    data.code = -1
    data.msg = '活动库存不足，已暂停活动'
  } else {
    //判断用户是否有抽奖次数
    let user = await db.collection('users').doc(event.uid).get()
    if (user.data.count > 0) {
      //有次数生成卡片并次数-1
      // let cardIndex = 3
      let cardIndex = Math.floor(Math.random() * cards.length)
      console.log(cards[cardIndex]);
      data.code = 200
      data.msg = '抽取成功'
      data.card = cards[cardIndex]
      data.cardIndex = cardIndex
      data.reward = ''
      let userCards = user.data.cards
      userCards[cardIndex] += 1
      //更新用户信息
      db.collection('users').doc(event.uid).update({
        data: {
          count: _.inc(-1),
          cards: userCards
        }
      })

      //判断该用户是否完成任务，完成任务，则活动表完成任务数+1,并把兑换码下发给用户
      if (userCards.indexOf(0) === -1) {

        //这个地方是下发兑换码，先查可发的码取第一条改变状态，但是担心高并发时会有重复发放的问题，需要大佬帮忙改进，应该用上原子操作或者事务,我这儿用的原子操作感觉不对
        let res = await db.collection('reward').where({
          actid: event.actid,
          status: 0
        }).get()
        let n = 1,
          i = 0
        if (res.data.length === 0) {
          n = 0
          data = {
            code: -1,
            msg: '奖品库存不足，已暂停活动'
          }

        }
        while (n) {
          await db.collection('reward').doc(res.data[i]._id).update({
            data: {
              status: _.inc(1)
            }
          }).then(result => {

            if (result.stats.updated == 1) {
              //写入用户获得的code 异步
              db.collection('users').doc(event.uid).update({
                data: {
                  code: res.data[i].code
                }
              })
              //活动完成人数+1 异步
              db.collection('activity').doc(event.actid).update({
                data: {
                  win: active.data.win + 1
                }
              })

              data.reward = res.data[i].code
              n = 0
            } else {
              i++
              if (i == res.data.length) {
                n = 0
              }
            }
          })
        }
      }

    } else {
      //没次数返回code码:-1
      data.code = -1
      data.msg = '您没有抽奖次数'
    }
  }

  return {
    data
  }
}